package com.rrjjg.app.mybatis.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rrjjg.app.mybatis.bean.PageData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;

/**
 * ----------------------------------------------------------------------------- <br>
 * 功能 :  <br>
 * ----------------------------------------------------------------------------- <br>
 * 作者 : Vayne <br>
 * 时间 : 2023/4/8 <br>
 */
@Slf4j
public abstract class PageUtil {

    /**
     * ----------------------------------------------------------------------------- <br>
     * 功能 : 实现vo 和 en对象互转，有限制字段名称需要对的上
     * 作者 : Vayne <br>
     * 时间 : 2023/4/8 <br>
     * ----------------------------------------------------------------------------- <br>
     */
    public static <E,V> E transformation(V v, Supplier<E> supplier) {
        E e = supplier.get();
        BeanUtils.copyProperties(v, e);
        return e;
    }

    /**
     * ----------------------------------------------------------------------------- <br>
     * 功能 : 这个方式是实现字段名称对应的转换
     * 作者 : Vayne <br>
     * 时间 : 2023/4/8 <br>
     * ----------------------------------------------------------------------------- <br>
     */
    public static <E,V> PageData<V> EtoVList(Page<E> es, Supplier<V> supplier){
        PageData<V> ans = new PageData<V>()
            .setPage(es.getCurrent())
            .setSize(es.getSize())
            .setTotal(es.getTotal());
        List<E> result = es.getRecords();
        if(!CollectionUtils.isEmpty(result)){
            List<V> vList = result.stream().map(e->transformation(e,supplier)).collect(Collectors.toList());
            ans.setList(vList);
        }
        return ans;
    }

    /**
     * ----------------------------------------------------------------------------- <br>
     * 功能 : 实现对象
     * 作者 : Vayne <br>
     * 时间 : 2023/4/8 <br>
     * ----------------------------------------------------------------------------- <br>
     */
    public static <E> PageData<E> EtoVList(Page<E> es){
        PageData<E> ans = new PageData<E>()
                .setPage(es.getCurrent())
                .setSize(es.getSize())
                .setTotal(es.getTotal())
                .setList(es.getRecords());
        return ans;
    }

    /**
     * ----------------------------------------------------------------------------- <br>
     * 功能 : 根据注解自动实现条件注入
     * 作者 : Vayne <br>
     * 时间 : 2023/4/8 <br>
     * ----------------------------------------------------------------------------- <br>
     */
    public static <E> QueryWrapper queryWrapper(E e ,Class<E> c){
        return  new ConditionalBuilder<>(e,c).wrapper();
    }


}
